/************************************************************************
*************************************************************************
@Name :       	jNotify - jQuery Plugin
@Revison :    	2.1
@Date : 		18/01/2011
@Author:     	 ALPIXEL (www.myjqueryplugins.com - www.alpixel.fr)
@Support:    	 FF, IE7, IE8, MAC Firefox, MAC Safari
@License :		 Open Source - MIT License : http://www.opensource.org/licenses/mit-license.php
 
**************************************************************************
*************************************************************************/
(function($) {

    $.jNotify = {
        defaults: {
            /** VARS - OPTIONS **/
            autoHide: true, 			// Notify box auto-close after 'TimeShown' ms ?
            clickOverlay: false, 		// if 'clickOverlay' = false, close the notice box on the overlay click ?
            MinWidth: 200, 				// min-width CSS property
            TimeShown: 1500, 				// Box shown during 'TimeShown' ms
            ShowTimeEffect: 200, 			// duration of the Show Effect
            HideTimeEffect: 200, 			// duration of the Hide effect
            LongTrip: 15, 				// in pixel, length of the move effect when show and hide
            HorizontalPosition: 'center', 	// left, center, right
            VerticalPosition: 'top',  // top, center, bottom
            ShowOverlay: true, 			// show overlay behind the notice ?
            ColorOverlay: '#000', 		// color of the overlay
            OpacityOverlay: 0.3, 		// opacity of the overlay

            /** METHODS - OPTIONS **/
            onClosed: null,
            onCompleted: null
        },

        /*****************/
        /** Init Method **/
        /*****************/
        init: function(msg, options, id) {
            opts = $.extend({}, $.jNotify.defaults, options);

            /** Box **/
            if ($("#" + id).length == 0)
                $Div = $.jNotify._construct(id, msg);

            // Width of the Brower
            WidthDoc = parseInt($(window).width());
            HeightDoc = parseInt($(window).height());

            // Scroll Position
            ScrollTop = parseInt($(window).scrollTop());
            ScrollLeft = parseInt($(window).scrollLeft());

            // Position of the jNotify Box
            posTop = $.jNotify.vPos(opts.VerticalPosition);
            posLeft = $.jNotify.hPos(opts.HorizontalPosition);

            // Show the jNotify Box
            if (opts.ShowOverlay && $("#jOverlay").length == 0)
                $.jNotify._showOverlay($Div);

            $.jNotify._show(msg);
        },

        /*******************/
        /** Construct DOM **/
        /*******************/
        _construct: function(id, msg) {
            $Div =
			$('<div id="' + id + '"/>')
			.css({ opacity: 0, minWidth: opts.MinWidth })
			.html(msg)
			.appendTo('body');
            return $Div;
        },

        /**********************/
        /** Postions Methods **/
        /**********************/
        vPos: function(pos) {
            switch (pos) {
                case 'top':
                    var vPos = ScrollTop + parseInt($Div.outerHeight(true) / 2);
                    break;
                case 'center':
                    var vPos = ScrollTop + (HeightDoc / 2) - (parseInt($Div.outerHeight(true)) / 2);
                    break;
                case 'bottom':
                    var vPos = ScrollTop + HeightDoc - parseInt($Div.outerHeight(true));
                    break;
            }
            return vPos;
        },

        hPos: function(pos) {
            switch (pos) {
                case 'left':
                    var hPos = ScrollLeft;
                    break;
                case 'center':
                    var hPos = ScrollLeft + (WidthDoc / 2) - (parseInt($Div.outerWidth(true)) / 2);
                    break;
                case 'right':
                    var hPos = ScrollLeft + WidthDoc - parseInt($Div.outerWidth(true));
                    break;
            }
            return hPos;
        },

        /*********************/
        /** Show Div Method **/
        /*********************/
        _show: function(msg) {
            $Div
			.css({
			    top: posTop,
			    left: posLeft
			});
            switch (opts.VerticalPosition) {
                case 'top':
                    $Div.animate({
                        top: posTop + opts.LongTrip,
                        opacity: 1
                    }, opts.ShowTimeEffect, function() {
                        if (opts.onCompleted) opts.onCompleted();
                    });
                    if (opts.autoHide)
                        $.jNotify._close();
                    else
                        $Div.css('cursor', 'pointer').click(function(e) {
                            $.jNotify._close();
                        });
                    break;
                case 'center':
                    $Div.animate({
                        opacity: 1
                    }, opts.ShowTimeEffect, function() {
                        if (opts.onCompleted) opts.onCompleted();
                    });
                    if (opts.autoHide)
                        $.jNotify._close();
                    else
                        $Div.css('cursor', 'pointer').click(function(e) {
                            $.jNotify._close();
                        });
                    break;
                case 'bottom':
                    $Div.animate({
                        top: posTop - opts.LongTrip,
                        opacity: 1
                    }, opts.ShowTimeEffect, function() {
                        if (opts.onCompleted) opts.onCompleted();
                    });
                    if (opts.autoHide)
                        $.jNotify._close();
                    else
                        $Div.css('cursor', 'pointer').click(function(e) {
                            $.jNotify._close();
                        });
                    break;
            }
        },

        _showOverlay: function(el) {
            var overlay =
			$('<div id="jOverlay" />')
			.css({
			    backgroundColor: opts.ColorOverlay,
			    opacity: opts.OpacityOverlay
			})
			.appendTo('body')
			.show();

            if (opts.clickOverlay)
                overlay.click(function(e) {
                    e.preventDefault();
                    opts.TimeShown = 0; // Thanks to Guillaume M.
                    $.jNotify._close();
                });
        },


        _close: function() {
            switch (opts.VerticalPosition) {
                case 'top':
                    if (!opts.autoHide)
                        opts.TimeShown = 0;
                    $Div.stop(true, true).delay(opts.TimeShown).animate({ // Tanks to Guillaume M.
                        top: posTop - opts.LongTrip,
                        opacity: 0
                    }, opts.HideTimeEffect, function() {
                        $(this).remove();
                        if (opts.ShowOverlay && $("#jOverlay").length > 0)
                            $("#jOverlay").remove();
                        if (opts.onClosed) opts.onClosed();
                    });
                    break;
                case 'center':
                    if (!opts.autoHide)
                        opts.TimeShown = 0;
                    $Div.stop(true, true).delay(opts.TimeShown).animate({ // Tanks to Guillaume M.
                        opacity: 0
                    }, opts.HideTimeEffect, function() {
                        $(this).remove();
                        if (opts.ShowOverlay && $("#jOverlay").length > 0)
                            $("#jOverlay").remove();
                        if (opts.onClosed) opts.onClosed();
                    });
                    break;
                case 'bottom':
                    if (!opts.autoHide)
                        opts.TimeShown = 0;
                    $Div.stop(true, true).delay(opts.TimeShown).animate({ // Tanks to Guillaume M.
                        top: posTop + opts.LongTrip,
                        opacity: 0
                    }, opts.HideTimeEffect, function() {
                        $(this).remove();
                        if (opts.ShowOverlay && $("#jOverlay").length > 0)
                            $("#jOverlay").remove();
                        if (opts.onClosed) opts.onClosed();
                    });
                    break;
            }
        },

        _isReadable: function(id) {
            if ($('#' + id).length > 0)
                return false;
            else
                return true;
        }
    };

    /** Init method **/
    jNotify = function(msg, options) {
        if ($.jNotify._isReadable('jNotify'))
            $.jNotify.init(msg, options, 'jNotify');
    };

    jSuccess = function(msg, options) {
        if ($.jNotify._isReadable('jSuccess'))
            $.jNotify.init(msg, options, 'jSuccess');
    };

    jError = function(msg, options) {
        if ($.jNotify._isReadable('jError'))
            $.jNotify.init(msg, options, 'jError');
    };
})(jQuery);